package jhlee42;

import java.util.ArrayList;

public class J19Generic {

	public static void main(String[] args) {
		Tiger zoo1[] = new Tiger[3]; // 호랑이를 가두기 위한 동물원
		Lion zoo2[] = new Lion[3]; // 사자를 가두기 위한 동물원
		Zibra zoo3[] = new Zibra[3]; // 얼룩말을 가두기 위한 동물원
		
		Animal zoo4[] = new Animal[4]; 
		// 호랑이,사자,얼룩말을 가둘수 있는 동물원
		// 호랑이,사자,얼굴말은 animal과 상속 관계
		
		
		Object zoo5[] = new Object[3]; 
		// 호랑이,사자,얼룩말 뿐만 아니라 언급되지 않은 다른 돌물도 가둘수 있는 동물원
		// Object 클래스는 모든 클래스의 조상
		
		
		zoo1[1] = new Tiger();
		// zoo1[2] = new Zibra(); // 오류!
		// zoo1은 Tiger만 담을 수 있음
		
		zoo4[0] = new Tiger();
		zoo4[1] = new Lion();
		zoo4[2] = new Zibra();
		//zoo4[3] = new Monkey(): // 오류!
		// Monkey는 Animal과 상속관계가 아님
			
		zoo5[0] = new Tiger();
		zoo5[1] = new Monkey();
		
		
		Animal ani1 = zoo4[1];
		//Lion Lion1 = zoo4[1];// 여기 있는 동물은 animal 로 인식..
		// Animal 객체를 Lion 객체에 
		// 저장하려면 먼저 downcasting 해야 함 
		Lion Lion1 = (Lion)zoo4[1];
		// 따라서, downcasting 시
		// 명시적으로 변환하려는 자료형을
		// 기술하는 것은 다소 귀찮을 수 있음(중요!)
		
		// 컬렉션 (가변크기 배열)
		// 컬렉션에서는 어떤 종류의 자료를 담을지
		// 모르기 때문에 최상위 조상객체인 Object형태로
		// 저장 및 관리하도록 설계되어 있음.
		
		
		
		ArrayList zoo6 = new ArrayList<>();
		zoo6.add(new Tiger()); // JDK 4이하에서 가능 
		zoo6.add(new Lion());
		zoo6.add(new Zibra());
		zoo6.add(new Monkey());
		zoo6.add(new Whale());
		
		// 제네릭을 이용하면 프로그래머가 컬렉션에
		// 사용할 객체의 유형을 명확하게 지정해서
		// 이 유형과 다른 객체는 저장되지 못하게 함.
		// 따라서, 컴파일시 오류확인이 빨라짐.
		ArrayList<Tiger> zoo7 = new ArrayList<Tiger>(); // JDK5 이상 가능
		
		zoo7.add(new Tiger());
		//zoo7.add(new Lion()); // 오류 !
		// zoo7 에는 제네릭으로 Tiger만 객체
		// 저장할 수 있도록 한정시킴
		// 따라서, 예상치 못한 오류가 발생할 수 있는
		// 가능성은 낮아짐
		
		ArrayList<Lion> zoo8 = new ArrayList<>(); // JDK7 이상 가능
		

		

	} // main

} // class

class Animal{}
class Tiger extends Animal{}
class Lion extends Animal{}
class Zibra extends Animal{}
class Monkey{}
class Whale{}























